您好,欢迎来到达州工业云! 平台首页 企业驾驶舱 帮助中心 企业登录 企业注册

HI,欢迎使用达州工业云平台!

账号必须大于2位

创新资源平台
服务平台首页>专利库>专利详情

面向类Linux操作系统的磁盘数据保护方法

  • 申请号:CN201210121227.2 申请公布号: CN102646079B
  • 申请日: 2012-04-23 申请公布日: 2014-07-16
  • 申请(专利权)人: 专利代理机构: 国防科技大学专利服务中心
  • 分类号:G06F12/16

专利介绍

本发明公开一种面向类Linux操作系统的磁盘数据保护方法。技术方案是修改Loop设备的4个函数,在loop_init开始处加入DSP_init(),在lo_receive开始处加入DSP_receive(),在lo_send开始处加入DSP_send(),在loop_exit开始处加入DSP_exit(),生成loop.ko;加载loop.ko,DSP_init()进行初始化;若用户请求为读取磁盘数据,DSP_receive()对pos进行修改;若用户请求为写入磁盘数据,DSP_send()对pos进行修改;若用户请求为退出,DSP_exit()进行卸载;采用本发明能实现对磁盘数据的透明保护。
1.一种面向类Linux操作系统的磁盘数据保护方法,其特征在于包括以下步骤:第一步,修改Loop设备的loop_init,lo_receive,lo_send以及loop_exit函数,将经过修改的Loop设备驱动程序统称为数据安全保护模块即DSP模块,修改方法是:在loop_init函数开始处加入函数DSP_init(),由DSP_init初始化DSP模块的初始数据;在lo_receive函数开始处加入函数DSP_receive(),由DSP_receive()根据需要修改lo_receive的参数pos,使pos指向重定向后的数据所在位置;在lo_send函数开始处加入函数DSP_send(),由DSP_send()根据需要修改lo_send的参数pos,使pos指向未使用的磁盘空间;在loop_exit函数开始处加入函数DSP_exit(),由DSP_exit()释放DSP模块初始化和程序运行中产生的内存资源;第二步,将修改后的loop_init,lo_receive,lo_send以及loop_exit函数编译链接,生成新的Loop设备驱动模块loop.ko;第三步,加载Loop设备驱动模块loop.ko,调用初始化函数loop_init,该函数调用DSP_init()进行如下初始化:
3.1构建一个线性链表blocklist,blocklist中每个元素存储一个二元组(old_block_num,new_block_num),old_block_num用于记录初始磁盘请求的块号,new_block_num用于记录重定向后的新块号,DSP_init()将blocklist初始化为空表;
3.2读取磁盘分区中文件系统的超级块、组描述符表,将它们缓存在内存中,根据缓存的超级块和组描述符表信息,获得以下数据:
3.2.1从组描述符表获得1到N号块组中空闲块的数目,将1到N号块组中空闲块的数目存贮在数组free_block_count[]中,free_block_count[m]存贮第m个块组中空闲块的数目,1≤m≤N,N为正整数;
3.2.2从超级块获得每个块组的块数block_count,各个块组的块数相等;
3.2.3从组描述符表获得1到N号块组的块位图的起始块号block_bitmap_start[],block_bitmap_start[m]存储第m个块组中块位图的起始块号;
3.2.4从组描述符表获得1到N号块组的i节点表的起始块号inode_table_start[],inode_table_start[m]存储第m个块组中i节点表的起始块号;
3.2.5从超级块获得1到N号块组的块大小block_size,单位为字节;
3.2.6从超级块获得每个块组所含i节点数inode_count;
3.2.7从组描述符表获得1到N号块组的i节点位图的起始块号inode_bitmap_start[],inode_bitmap_start[m]存储第m个块组中i节点位图的起始块号;
3.2.8从超级块获得文件系统总块数total_block_count;
3.3计算1到N号块组的块位图的大小、i节点表的大小、块组的个数:
3.3.1第m个块组的块位图的大小:block_bitmap_size[m]=(inode_bitmap_start[m]-block_bitmap_start[m])×block_size,inode_bitmap_start[m]为第m个块组的i节点位图的起始块号,block_bitmap_start[m]是第m个块组的块位图的起始块号,block_size为块大小,单位为字节;
3.3.2块组的i节点表的大小inode_table_size:inode_table_size=inode_count×128/block_size,符号“/”表示除法,128为每个i节点大小,单位为字节;
3.3.3块组的个数:group_count=total_block_count/block_count;
3.4根据1到N号块组的块位图起始块号block_bitmap_start[],及块位图的大小block_bitmap_size[]从磁盘上读取1到N号块组的块位图block_bitmap[];
3.5loop_init[]函数初始化设备;第四步,等待用户的数据访问请求,如果数据访问请求为读取磁盘数据,执行第五步;如果用户请求为写入磁盘数据,执行第六步;如果用户请求为退出磁盘保护模块,执行第七步;第五步,lo_receive启动,调用DSP_receive()对lo_receive的参数pos即本次数据访问请求的磁盘位置进行修改,方法是:
5.1计算要读取的磁盘块号:ntent="drawing" img-format="tif" inline="yes" orientation="portrait" wi="700"/>表示对x下取整;
5.2用request_block_num查询链表blocklist,如果blocklist所有的二元组中的old_block_num均不与request_block_num相等,则表明该块没有被重定向,不需要修改pos,执行5.3;如果存在(old_block_num,new_block_num),使得old_block_num等于request_block_num,则将当前要读取的磁盘位置pos修改为new_block_num×block_size+pos%block_size,其中%为取余运算;
5.3lo_recive函数将从磁盘中pos所指位置读取的数据填充到bio描述的本次数据访问请求中内存中存放数据的缓冲区,所述bio是lo_recive函数的一个参数,类Linux系统内核启动lo_recive函数时给bio赋值,转第四步;第六步,lo_send启动,调用DSP_send()对lo_send的参数pos,即本次数据访问请求的磁盘位置进行修改,方法是:
6.1计算要写入的磁盘块号:ntent="drawing" img-format="tif" inline="yes" orientation="portrait" wi="700"/>
6.2用request_block_num查询链表blocklist,如果blocklist表中存在二元组(old_block_num,new_block_num),使得old_block_num等于request_block_num,则将当前要写入的磁盘位置pos修改为new_block_num×xa0block_size+pos%block_size,转6.7;如果blocklist表中所有二元组中的old_block_num均不与request_block_num相等,则执行6.3;
6.3判断request_block_num对应的数据块是否位于数据区;
6.4如果request_block_num对应的数据块位于数据区,转6.6;如果request_block_num对应的数据块不位于数据区,转6.5;
6.5将request_block_num对应的数据块的写操作透明重定向到一个未用的数据块,方法为:寻找一个空闲块new_block_num,如果当前已无空闲块可用,令lo_send函数出错退出,不再进行后续写入操作,转第四步,否则转
6.7;
6.6查询request_block_num所在块组的块位图block_bitmap[group_num],如果该块为未占用块,则修改block_bitmap[group_num]中对应该块的比特位的值为1,并将free_block_count[group_num]的值减1,令new_block_num=request_block_num,转6.7,group_num指request_block_num对应的数据块所在的块组号;如果该块为已占用块,则寻找一个空闲块new_block_num,如果当前已无空闲块可用,令lo_send函数出错退出,不再进行后续写入操作,转第四步,如果找到了空闲块,转6.7;
6.7将(request_block_num,new_block_num)加入到链表blocklist中,将当前要写入的磁盘位置pos修改为new_block_num×block_size+pos%block_size;
6.8lo_send函数将bio描述的内存缓冲区中的数据写入磁盘中pos所指的位置,转第四步,所述bio是lo_send函数的一个参数,类Linux系统内核启动lo_send函数时给bio赋值,;第七步,loop_exit启动卸载模块,调用DSP_exit()对模块进行如下操作:
7.1DSP_exit()函数释放DSP模块初始化和程序运行中产生的内存空间;
7.2继续执行loop_exit函数,对Loop设备卸载。
2.如权利要求1所述的面向类Linux操作系统的磁盘数据保护方法,其特征在于所述判断request_block_num对应的数据块是否位于数据区的方法是:步骤2.1计算request_block_num对应的数据块所在的块组号:ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>步骤2.2计算块组号为group_num的块组的数据区起始块号:data_start=inode_table_start[group_num]+inode_table_size;步骤2.3如果request_block_num<data_start,表明request_block_num对应的数据块位于数据区之前的文件系统元数据区,否则表明request_block_num对应的数据块位于数据区。
3.如权利要求1所述的面向类Linux操作系统的磁盘数据保护方法,其特征在于所述寻找一个空闲块new_block_num的方法是调用函数findfree(),findfree()函数过程如下:步骤3.1令k=-1;步骤3.2令k=k+1,如果k≥group_count,group_count为块组数,则函数报错退出,否则检查free_block_count[m]的值判断第k个块组是否还有空闲块可用,如果free_block_count[k]=0,转步骤3.2,否则转步骤3.3;步骤3.3设置循环变量i=0;步骤3.4令block_bitmap[k][i]表示第k个块组的块位图的第i个比特的数据,如果block_bitmap[k][i]为0,表示对应的块未占用,判断block_bitmap[k][i]对应的块是否位于数据区,如果位于数据区,则修改block_bitmap[k][i]的值为1,表示对应的块已占用,将free_block_count[k]的值减1,返回这个比特所表示的块号new_block_num;如果block_bitmap[k][i]不为0或block_bitmap[k][i]对应的块不位于数据区,i=i+1,如果i<block_bitmap_size[k]×8,其中8为每个字节包含的比特数,转步骤3.4,否则转步骤3.2。技术领域
本发明涉及计算机文件系统和存储领域,特指一种面向类Linux操作系统的磁盘数据保护方法。
背景技术
在日前主流的操作系统中,Windows操作系统占据了大部分市场。但Windows系统的闭源性、安全性也带来日益严重的问题。类Linux操作系统,由于其高性能,高安全性及源代码开放的特点,在世界上得到越来越广泛的使用。尤其在政府、军工等与国家安全相关的关键领域,各国已经将采用自主可控的操作系统作为国家重要的战略规划项目,国内采用类Linux系统的用户也越来越多。我国也基于类Linux操作系统开发了自主可控的国产操作系统,如麒麟,红旗,中标等。磁盘数据保护功能是提高操作系统安全性的重要组成部分。基于Windows操作系统,进行数据安全保护的产品主要为影子系统,该系统可以实现对硬盘内数据的安全保护,但其为商业产品,核心技术是不公开的。并且,由于操作系统架构和实现的根本不同,基于Windows操作系统的数据安全保护方法无法应用到类Linux操作系统上。面向类Linux系统,目前还未见有公开的数据安全保护方法。因此,随着类Linux系统的广泛运用,研究基于类Linux系统的数据安全保护方法,有着重要的理论意义和实用价值。类Linux操作系统结构如图1所示。与磁盘数据保护有关的部分为文件系统接口、文件系统模块、块设备驱动模块。用户的磁盘数据操作通过调用文件系统接口进入操作系统内核,由相应的文件系统模块截获,文件系统模块再调用相应的块设备驱动模块进行磁盘数据操作,并将结果返回给用户。类Linux操作系统目前使用的主流文件系统为Ext2,Ext3,Ext4,这三种文件系统保持了良好的兼容性,本发明的方法可以不加修改地直接适用于这三种文件系统。这些文件系统简称为Extx文件系统。图2上部分为Extx文件系统的磁盘布局结构图。Extx文件系统以块为基本的读写和分配单位,磁盘分区中的第一块作为引导块保留,不受Extx文件系统管理,磁盘分区中的其余部分由Extx文件系统管理,被分成N个大小相等的块组。每个块组如图2下部分所示,包含超级块、组描述符表、块位图、i节点位图、i节点表、数据区六个部分:超级块占用一个块的空间,描述整个文件系统的信息,1到N号块组中的超级块内容是相同的,包括文件系统中i节点的个数,每个i节点结构的大小,文件系统总块数,空闲块数,块大小,每个块组所含块数,每个块组所含i节点数等。其中,i节点在英文文献中称为inode,用于描述一个文件的元数据信息。组描述符表由块组描述符构成,1到N号块组中的组描述符表的内容是相同的。每个块组描述符描述一个块组的信息,占用32个字节。组描述符表中包含的块组描述符数量与该磁盘系统中的块组数N相等。每个块组描述符描述的信息包括该块组中块位图的起始地址,i节点位图的起始地址以及i节点表起始地址,单位均为块号,此外,还包括该块组中空闲的块数,该块组中的空闲i节点数,该块组中目录数。块位图描述该块组中块的使用情况,每个比特(bit)代表本块组中的一个块,比特的值为1表示对应的块已使用,为0表示该块空闲可用。i节点位图占一个块,其中每个比特表示一个i节点是否空闲可用。比特的值为1表示对应的i节点已使用,为0表示对应的i节点空闲可用。i节点表包含所在块组内所有i节点。由于文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,这些信息存在i节点中。每个i节点占用128字节。每个文件都对应一个i节点,一个块组中的所有i节点组成i节点表。i节点表中的数据也称为文件的元数据。数据区用于存放文件数据。在类Linux操作系统中,磁盘读写的流程如图3所示,用户的数据访问请求通过调用文件系统接口进入操作系统内核,由Extx文件系统模块截获,Extx文件系统模块再调用相应的块设备驱动模块进行磁盘数据操作,并将结果返回给用户。这种方法由于用户可以直接操作磁盘上的数据,无法保护数据的安全,在恶意攻击下可能导致数据丢失,系统损坏,信息泄露等情况发生。Loop设备,全称为Loopback设备,是类Linux系统内核中一个虚拟块设备。它可以跟一个具体的物理磁盘块设备建立关联。建立关联之后,Loop设备对文件系统看来,就是一个标准的磁盘块设备,可以进行格式化、传统的磁盘读写等。用户对Loop设备的数据访问请求会首先被Loop设备的驱动程序截获,然后该程序调用其关联的具体物理磁盘的驱动程序去进行实际读写操作。因而对Loop设备的操作,实际是对其关联的物理磁盘块设备的操作。这样,Loop设备可以截获所有与其关联的物理磁盘设备的操作,对上层应用屏蔽具体物理磁盘驱动的细节。Loop设备的驱动程序代码中,设备加载时将调用loop_init函数,由loop_init函数初始化设备,设备卸载时将调用loop_exit函数,释放系统资源,对关联的底层物理磁盘的读操作函数为lo_receive,对底层物理磁盘的写操作函数为lo_send。lo_recive函数包含三个参数:lo是loop设备描述符,描述loop设备相关信息;bio描述内存中存放数据的缓冲区位置;pos描述要读取的数据在磁盘中的位置。lo_recive函数将从磁盘中pos所指位置读取的数据填充到bio描述的内存缓冲区。lo_send函数进行磁盘写操作,同样包含三个参数:lo为loop设备描述符;bio描述内存中存放数据的缓冲区位置;pos表示数据要写入的磁盘位置。lo_send函数将bio描述的内存缓冲区中的数据写入磁盘中pos所指的位置。因此,若利用Loop设备,将Loop设备与要保护的物理磁盘建立关联,修改Loop设备驱动程序,在Loop设备对底层物理磁盘的读写操作之前,根据需要对磁盘原有数据的修改操作进行透明重定向,则可以实现对磁盘数据的安全保护。目前还没有公开文献涉及利用Loop设备进行磁盘数据保护的方法。
发明内容
本发明要解决的技术问题是在类Linux系统中实现对磁盘原有数据的保护。本发明的技术方案是:第一步,修改Loop设备的loop_init,lo_receive,lo_send以及loop_exit函数,将经过修改的Loop设备驱动程序统称为数据安全保护模块,简称为DSP(Dataxa0Securityxa0Protection)模块。修改方法是:在loop_init函数开始处加入函数DSP_init(),由DSP_init()初始化DSP模块的初始数据。在lo_receive函数开始处加入函数DSP_receive(),由DSP_receive()根据需要修改lo_receive的参数pos,使pos指向重定向后的数据所在位置。在lo_send函数开始处加入函数DSP_send(),由DSP_send()根据需要修改lo_send的参数pos,使pos指向未使用的磁盘空间,以避免破坏已有数据。在loop_exit函数开始处加入函数DSP_exit(),由DSP_exit()释放DSP模块初始化和程序运行中产生的内存资源。第二步,将修改后的loop_init,lo_receive,lo_send以及loop_exit函数编译链接,生成新的loop设备驱动模块loop.ko。第三步,加载loop设备驱动模块loop.ko,调用初始化函数loop_init,该函数调用DSP_init()进行如下初始化:3.1构建一个线性链表blocklist,blocklist中每个元素存储一个二元组(old_block_num,new_block_num),old_block_num用于记录初始磁盘请求的块号,new_block_num用于记录重定向后的新块号。DSP_init()将blocklist初始化为空表;3.2读取磁盘分区中文件系统的超级块、组描述符表,将它们缓存在内存中。根据缓存的超级块和组描述符表信息,获得以下数据:3.2.1从组描述符表获得1到N号块组中空闲块的数目,将1到N号块组中空闲块的数目存贮在数组free_block_count[]中,free_block_count[m]存贮第m个块组中空闲块的数目,1≤m≤N。3.2.2从超级块获得每个块组的块数block_count,各个块组的块数相等;3.2.3从组描述符表获得1到N号块组的块位图的起始块号block_bitmap_start[],block_bitmap_start[m]存储第m个块组中块位图的起始块号,1≤m≤N;3.2.4从组描述符表获得1到N号块组的i节点表的起始块号inode_table_start[],inode_table_start[m]存储第m个块组中i节点表的起始块号,1≤m≤N;3.2.5从超级块获得1到N号块组的块大小block_size,单位为字节,各个块组的块大小相等;3.2.6从超级块获得每个块组所含i节点数inode_count,各个块组所含i节点数相等;3.2.7从组描述符表获得1到N号块组的i节点位图的起始块号inode_bitmap_start[],inode_bitmap_start[m]存储第m个块组中i节点位图的起始块号,1≤m≤N;3.2.8从超级块获得文件系统总块数total_block_count;3.3计算1到N号块组的块位图的大小,i节点表的大小,块组的个数:3.3.1第m个块组的块位图的大小:block_bitmap_size[m]=(inode_bitmap_start[m]?block_bitmap_start[m])×block_size,inode_bitmap_start[m]为块组m的i节点位图的起始块号,block_bitmap_start[m]是第m个块组的块位图的起始块号,block_size为块大小,单位为字节;3.3.2块组的i节点表的大小inode_table_size:inode_table_size=inode_count×128/block_size,符号“/”表示除法,128为每个i节点大小,单位为字节,各个块组的i节点表的大小相等;3.3.3块组的个数:group_count=total_block_count/block_count;3.4根据1到N号块组的块位图起始块号block_bitmap_start[],及块位图的大小block_bitmap_size[]从磁盘上读取1到N号块组的块位图block_bitmap[];3.5loop_init[]函数初始化设备,这个步骤与背景技术所述现有Loop设备的loop_init函数初始化设备过程一样。第四步,等待用户的数据访问请求,如果数据访问请求为读取磁盘数据,执行第五步;如果用户请求为写入磁盘数据,执行第六步。如果用户请求为退出磁盘保护模块,执行第七步。第五步,lo_receive启动,调用DSP_receive()对lo_receive的参数pos即本次数据访问请求的磁盘位置进行修改,方法是:5.1计算要读取的磁盘块号:ntent="drawing" img-format="tif" inline="yes" orientation="portrait" wi="700"/>表示对x下取整。5.2用request_block_num查询链表blocklist,如果blocklist所有的二元组中的old_block_num均不与request_block_num相等,则表明该块没有被重定向,不需要修改pos,执行5.3。如果存在(old_block_num,new_block_num),使得old_block_num等于request_block_num,则将当前要读取的磁盘位置pos修改为new_block_num×block_size+pos%block_size,其中%为取余运算。5.3lo_recive函数将从磁盘中pos所指位置读取的数据填充到bio描述的本次数据访问请求中内存中存放数据的缓冲区,所述bio是lo_recive函数的一个参数,类Linux系统内核启动lo_recive函数时给bio赋值,转第四步。第六步,lo_send启动,调用DSP_send()对lo_send的参数pos,即本次数据访问请求的磁盘位置进行修改,方法是:6.1计算要写入的磁盘块号:ntent="drawing" img-format="tif" inline="yes" orientation="portrait" wi="700"/>6.2用request_block_num查询链表blocklist,如果blocklist表中存在二元组(old_block_num,new_block_num),使得old_block_num等于request_block_num,则将当前要写入的磁盘位置pos修改为new_block_num×block_size+pos%block_size,转6.7;如果blocklist表中所有二元组中的old_block_num均不与request_block_num相等,则执行6.3。6.3判断request_block_num对应的数据块是否位于数据区,方法为:6.3.1计算request_block_num对应的数据块所在的块组号:ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>6.3.2计算块组号为group_num的块组的数据区起始块号:data_start=inode_table_start[group_num]+inode_table_size;6.3.3如果request_block_num<data_start,表明request_block_num对应的数据块位于数据区之前的文件系统元数据区,即request_block_num对应的数据块不位于数据区,否则表明request_block_num对应的数据块位于数据区;6.4如果request_block_num对应的数据块位于数据区,转6.6;如果request_block_num对应的数据块不位于数据区,转6.5;6.5request_block_num对应的数据块位于元数据区,这些区域的信息是必须被保护的,将request_block_num对应的数据块的写操作透明重定向到一个未用的数据块,具体方法为:调用函数findfree(),寻找一个未使用块new_block_num,如果findfree()返回错误,表明当前已无空闲块可用,令lo_send函数出错退出,不再进行后续写入操作,转第四步,否则转6.7。findfree()函数过程如下:6.5.1令k=-1;6.5.2令k=m+1,如果k≥group_count,group_count为块组数,则函数报错退出,否则检查free_block_count[m]的值判断第k个块组是否还有空闲块可用,如果free_block_count[k]==0,则转6.5.2,否则转6.5.3;6.5.3设置循环变量i=0;6.5.4令block_bitmap[k][i]表示第k个块组的块位图的第i个比特的数据,如果block_bitmap[k][i]为0,表示对应的块未占用,再判断block_bitmap[k][i]对应的块是否位于数据区,如果该块位于数据区,则修改block_bitmap[k][i]的值为1,表示对应的块已占用,并将free_block_count[k]的值减1,返回这个比特所表示的块号new_block_num;如果block_bitmap[k][i]不为0或block_bitmap[k][i]对应的块不位于数据区,i=i+1,如果i<block_bitmap_size[k]×8,其中8为每个字节包含的比特数,转6.5.4,否则转6.5.2;6.6查询request_block_num所在块组的块位图block_bitmap[group_num],如果该块为未占用块,则修改block_bitmap[group_num]中对应该块的比特位的值为1,表示对应的块已占用,并将free_block_count[group_num]的值减1,令new_block_num=request_block_num,转6.7;否则,表示该块为一个已占用块,该块的数据是必须被保护的,调用函数findfree()寻找一个空闲块new_block_num,如果findfree()返回错误,表明当前已无空闲块可用,令lo_send函数出错退出,不再进行后续写入操作,转第四步,如果findfree()找到了空闲块,转6.7;6.7将(request_block_num,new_block_num)加入到链表blocklist中,将当前要写入的磁盘位置pos修改为new_block_num×block_size+pos%block_size;6.8lo_send函数将bio描述的内存缓冲区中的数据写入磁盘中pos所指的位置,转第四步,所述bio是lo_send函数的一个参数,类Linux系统内核启动lo_send函数时给bio赋值;第七步,loop_exit启动卸载模块,调用DSP_exit()对模块进行如下操作:7.1DSP_exit()函数释放DSP模块初始化和程序运行中产生的内存资源,防止内存泄露;7.2继续执行loop_exit函数,对Loop设备卸载,这个步骤与背景技术所述现有Loop设备的loop_exit函数对Loop设备卸载过程一样。采用本发明可以达到以下技术效果:本发明能够对磁盘数据进行透明保护,采用本发明后,用户可以在不感知数据安全保护模块存在的情况下对本地硬盘进行任何读写操作,所有对磁盘原有数据的新增,修改,删除操作都被透明重定向到磁盘上的未用空间,不会对原有磁盘数据产生影响,这些操作在重新启动操作系统或者数据安全保护模块卸载之后自动失效。例如,如果用户不小心删除了文件,或病毒木马程序恶意删除了数据,在数据安全保护模块卸载后,这些数据将完好如初。如果病毒木马侵入了系统,或是安装了难以卸载的流氓软件,在数据安全保护模块卸载后,这些软件都将不复存在,系统将回复到上次加载磁盘保护系统之前的干净状态。因此,所有的病毒、木马程序、流氓软件都无法侵害硬盘上的数据。本发明可以用于个人计算机上网,网吧,单位计算机房,可以简化管理,具有广泛的实用价值。
附图说明
图1:背景技术所述现有类Linux操作系统各个内核接口与内核模块之间的关系示意图。图2:背景技术所述现有Extx类文件系统的磁盘布局结构图。图3:背景技术所述现有类Linux操作系统对磁盘数据访问的流程图。图4:采用本发明加入磁盘保护模块后类Linux操作系统对磁盘数据访问的流程图。图5:本发明的总体流程图。
具体实施方式
图4是采用本发明加入磁盘保护模块(DSP模块)后类Linux操作系统对磁盘数据访问的流程图。DSP模块加载于Loop设备的驱动程序代码中。用户的数据访问请求通过调用文件系统接口进入操作系统内核,由Extx文件系统模块截获,Extx文件系统模块再调用带有DSP模块的Loop设备驱动模块,由带有DSP模块的Loop设备驱动模块调用关联的底层物理磁盘设备驱动模块进行磁盘数据操作,并将结果返回给用户。图5为本发明总体流程图。第一步,修改Loop设备的loop_init,lo_receive,lo_send以及loop_exit函数,将经过修改的Loop设备驱动程序统称为数据安全保护模块,简称为DSP(Dataxa0Securityxa0Protection)模块。第二步,将修改后的loop_init,lo_receive,lo_send以及loop_exit函数编译,生成新的loop设备驱动模块loop.ko。在loop_init函数开始处加入函数DSP_init(),在lo_receive函数开始处加入函数DSP_receive(),在lo_send函数开始处加入函数DSP_send(),在loop_exit函数开始处加入函数DSP_exit()。第三步,加载Loop设备驱动模块,由初始化函数loop_init在初始化设备前调用DSP_init()进行DSP模块的初始化。第四步,等待用户的请求。如果数据访问请求为读取磁盘数据,执行第五步;如果用户请求为写入磁盘数据,执行第六步;如果用户请求为退出磁盘保护模块,执行第七步。第五步,lo_receive启动,调用DSP_receive()对pos进行修改。第六步,lo_send启动,调用DSP_send()对pos进行修改。第七步,loop_exit启动,调用DSP_exit()释放DSP模块初始化和程序运行中产生的内存资源,并由loop_exit函数卸载Loop设备。